package com.gym.myshop.web.controller;

import com.gym.myshop.common.Const;
import com.gym.myshop.util.StrUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;


/**
 * @author ming
 * 2021/11/3
 * description:做继承使用复用方法
 */
public class BaseServlet extends HttpServlet {



    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理method 是null 或者 "" method类代表类中的一个方法的定义
        String method = request.getParameter("method");
        if (!StrUtils.isNotEmpty(method)) {
            response.sendRedirect(request.getContextPath()+"/index.jsp");
            //不让方法继续向下执行
            return;
        }

        try {
            //只需要方法名,参数 就可以自己调用方法 反射
            //1 使用this,这个父类的this,不是指向父类本身 而是调用父类方法的子类实例对象
            Class<? extends BaseServlet> aClass = this.getClass();
            //2 通过方法名和参数列表来找到对应的方法
            Method method1 = aClass.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            //3 通过反射调用子类的目标方法 invoke委托
            String invoke = (String) method1.invoke(this, request, response);
            //4 把页面的响应处理交他完成
            // 1.forward   2.redirect 3.json字符串
//            System.out.println("invoke:"+invoke);
            if (invoke!=null) {
                if (invoke.startsWith(Const.FORWARD)) {
                    //要求转发
                    request.getRequestDispatcher(invoke.substring(invoke.indexOf(":")+1)).forward(request,response);
                }else if(invoke.startsWith(Const.REDIRECT)) {
                    //要求重定向
                    response.sendRedirect(request.getContextPath()+"/"+invoke.substring(invoke.indexOf(":")+1));
                }else {
                    //json字符串
                    PrintWriter writer = response.getWriter();
                    writer.write(invoke);
                    writer.flush();
                    writer.close();
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
            response.sendRedirect(request.getContextPath()+"/error404.jsp");

        }
    }
}
